package com.example.mybatisplusdemo.common.utls;


import com.example.mybatisplusdemo.model.domain.Admin;
import com.example.mybatisplusdemo.model.domain.Merchant;
import com.example.mybatisplusdemo.model.domain.Store;
import com.example.mybatisplusdemo.model.domain.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;



public class SessionUtils {
    private static final String USER_KEY = "sessionUser";
    private static final String MERCHANT_KEY = "sessionMerchant";
    private static final String ADMIN_KEY = "sessionAdmin";
    private static final String STORE_KEY = "sessionStore"; // 存储店铺信息时，添加这个键
    /**
     * 说明：
     * USER_KEY 是用作 session 中存储和获取用户信息的键。
     * 它的值 "sessionUser" 决定了 session 里存储用户对象时的命名空间。
     * 所有通过 session().setAttribute(USER_KEY, ...) 存储的对象都会覆盖同一个 session 键下的值。
     * <p>
     * 影响：
     * <p>
     * 如果你用同一个 USER_KEY 存储不同类型（如 User、Merchant、Admin），后存储的会覆盖前面的，
     * 导致只能取出最后一次存储的对象，类型也可能不匹配。这会引发类型转换异常或数据混淆。
     * 建议赋值方式：
     * <p>
     * 为不同类型分别定义不同的 key，例如：
     * private static final String USER_KEY = "sessionUser";
     * private static final String MERCHANT_KEY = "sessionMerchant";
     * private static final String ADMIN_KEY = "sessionAdmin";
     * 存取时用对应的 key，避免覆盖和类型混淆。
     * 这样可以保证 session 中不同类型的数据互不干扰，安全可靠。
     */

    public static HttpSession session() {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        return attr.getRequest().getSession(true); // true == allow create
    }

    public static User getCurrentUserInfo() {
        return (User) session().getAttribute(USER_KEY);
    }

    public static Merchant getCurrentMerchantInfo() {
        return (Merchant) session().getAttribute(MERCHANT_KEY);
    }

    public static void saveCurrentUserInfo(User user) {
        session().setAttribute(USER_KEY, user);
    }

    public static void saveCurrentMerchantInfo(Merchant merchant) {
        session().setAttribute(MERCHANT_KEY, merchant);
    }

    public static void saveCurrentAdminInfo(Admin admin) {
        session().setAttribute(ADMIN_KEY, admin);
    }

    public static Admin getCurrentAdminInfo() {
        return (Admin) session().getAttribute(ADMIN_KEY);
    }

    public static void saveCurrentStoreInfo(Store store) {
        session().setAttribute(STORE_KEY, store);
    }

    public static Store getCurrentStoreInfo() {
        return (Store) session().getAttribute(STORE_KEY);
    }

//    public static void clearSession() {
//        // 1. 清除服务器Session
//        HttpServletRequest request = ((ServletRequestAttributes)
//                RequestContextHolder.getRequestAttributes()).getRequest();
//        HttpSession session = request.getSession(false);
//
//        if (session != null) {
//            session.invalidate(); // 使当前会话失效
//        }
//
//        // 2. 清除可能的Token缓存（根据实际项目调整）
//        // 例如Redis中的Token记录
//        String token = request.getHeader("Authorization");
//        if (token != null && token.startsWith("Bearer ")) {
//            String jwtToken = token.substring(7);
//            // RedisUtils.del("token:" + jwtToken); // 示例Redis操作
//        }
//    }
}
